
package com.b2mining.integration.helper;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;

import javax.mail.MessagingException;

import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

import com.b2mining.integration.mail.MailAttributes;
import com.b2mining.integration.mail.Mailer;


/**
 * Clase que permite almacena funciones de ayuda.  
 * @since (7/3/2003 10:35:26 AM)
 * @author Synopsis S.A. <BR>
 * Analista Programador: Miguel Lora G., Janyn Roca
 * 						
 */
public class Helper {

	public static java.lang.String fileIni = System.getProperty("user.dir")+"\\properties.ini";
	public static Properties prop = null;
	
	//LOG
    //public static String fileLog = System.getProperty("user.dir")+"\\log\\logFile.log";
    private static String fileProperties = System.getProperty("user.dir")+"\\log4j.properties";
	
	public static InputStream is;
	public static String url;
	public static String schema;
	public static String driver;
	public static String user;
	public static String password;
	public static String dtd;
	public static String xmlInputDirectory;
	public static String xmlOutputDirectory;
	public static java.lang.String log;
	public static int debug;
	public static java.lang.String tipoCliente;
	public static String empresa;
	public static String rutaactualizacion;
	//public static String formatoFechaBD;
	public static int correlationId;
	public static String directorioOrigen;
	public static String tipoProceso;
	
	public static int tiempo_espera_mq;
	public static int tiempo_espera_file;
	
	public static String mailFrom;
	public static String mailFromName;
	public static String mailHost;
	public static String mailHostName;
	public static String mailUserId;
	public static String mailPassword;
	public static String mailToDummy;
	public static String flagEmailTrue="1";	
	public static String tesoreriasapbc;
	public static String tipoEjecucion;
	//public static String proceso;
	public static final int FILL_RIGHT = 0;
	public static final int FILL_LEFT = 1;
	
	/** CAMBIO RHANDY **/
	public static String rutaarchivotxt;
	public static String rutaarchivoxml;
	//public static String rutaempresa;
	public static String destinatario;
	//public static String FiltroProveedores;
	public static String RutaArchivoProveedores;
	/** CAMBIO RHANDY **/
	
	
	public static Logger log2 = Logger.getLogger(Helper.class);
	
	static {
		try {
			is = new FileInputStream(fileIni);
			prop = new Properties();
			prop.load(is);
			//formatoFechaBD = prop.getProperty("formatoFechaBD");
			tipoProceso = prop.getProperty("tipoProceso");
			tiempo_espera_mq = Integer.parseInt(prop.getProperty("tiempo_espera_mq"));
			tiempo_espera_file = Integer.parseInt(prop.getProperty("tiempo_espera_file"));
			mailFrom = prop.getProperty("mailFrom");
			mailFromName = prop.getProperty("mailFromName");
			mailHost = prop.getProperty("mailHost");
			mailHostName = prop.getProperty("mailHostName");
			mailUserId = prop.getProperty("mailUserId");
			mailPassword=prop.getProperty("mailPassword");
			mailToDummy=prop.getProperty("mailToDummy");
			tipoEjecucion=prop.getProperty("tipoEjecucion");
			//proceso=prop.getProperty("proceso");
			
			rutaarchivotxt=prop.getProperty("rutaarchivotxt");
			rutaarchivoxml=prop.getProperty("rutaarchivoxml");
			//rutaempresa=prop.getProperty("rutaempresa");
			//FiltroProveedores=prop.getProperty("FiltroProveedores");
			RutaArchivoProveedores=prop.getProperty("RutaArchivoProveedores");
			/*** INICIO LOG4J - MIJAIL ALANIA ***/
			PropertyConfigurator.configure(fileProperties);
			/************************************/
		} 
		catch (Exception e) {
			System.out.println("Helper error :" + e);
			//e.printStackTrace();
		} 
		finally {
			try {
				if (is != null)
					is.close();
			} catch (Exception e) {
				System.out.println(
					"Helper error al cerrar el archivo properties");
			}
		}
	}

	public static String getRutaarchivoxml() {
		return rutaarchivoxml;
	}



	//public static String getRutaempresa() {
	//	return rutaempresa;
	//}



	//public static void setRutaempresa(String rutaempresa) {
	//	Helper.rutaempresa = rutaempresa;
	//}



	public static void setRutaarchivoxml(String rutaarchivoxml) {
		Helper.rutaarchivoxml = rutaarchivoxml;
	}



	public static String getRutaarchivotxt() {
		return rutaarchivotxt;
	}



	public static void setRutaarchivotxt(String rutaarchivotxt) {
		Helper.rutaarchivotxt = rutaarchivotxt;
	}



	public static String getMailToDummy() {
		return mailToDummy;
	}



	public static void setMailToDummy(String mailToDummy) {
		Helper.mailToDummy = mailToDummy;
	}



	public boolean validateDateFormat(java.lang.String date) {
		// TODO: implement
		return false;
	}
	

	
	//public static String getFiltroProveedores() {
	//	return FiltroProveedores;
	//}



	public static String getRutaArchivoProveedores() {
		return RutaArchivoProveedores;
	}



	/**
	 * Metodo que imprime una cadena en el archivo log
	 * @param arg cadena a imprimir
	 */	
	public static synchronized void print(java.lang.String arg) {
		FileWriter fw = null;
		PrintWriter out = null;
		try {
			fw = new FileWriter(log,true);
			out = new PrintWriter(fw);
			out.println("["+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"]" +arg);
		} catch (Exception e) {
			System.out.println("Error en log.debug: "+e);
		} finally {
			try {
				if (fw != null)
					fw.close();
				if (out != null)
					out.close();
			} catch (Exception e) {
			}
		}
	}

	public static String getTipoCliente(){
		return tipoCliente;
	}
	
	/**
	 * Metodo que completa una cadena con espacions en blanco de acuerdo a una longitud.
	 * @param name cadena
	 * @param maxNum longitud hasta la cual se completara con blancos.
	 * @return Connection la conexion con la Base de Datos.
	 */	
	public static String completeWhites (String name, int maxNum) {
		
		int i,n;
		
		n = name.length();
		
		//llena de blancos
		for(i=0;i<maxNum-n;i++)
			  name = name + " ";
	
		return name;
	}

	
	
	/**
	 * Metodo que le da formato a un objeto de la clase Double.
	 * @param numero numero a formatear
	 * @param formato formato a aplicar al numero
	 * @return cadena que contiene al numero formateado
	 */	
	public static String formateaDouble(Double numero,String formato){
		String numeroFormateado;
		DecimalFormatSymbols decimalFormatSymbol = new DecimalFormatSymbols();
        decimalFormatSymbol.setDecimalSeparator('.');
        DecimalFormat decimalFormat = new DecimalFormat(formato,decimalFormatSymbol);
		numeroFormateado= decimalFormat.format(numero);
		return numeroFormateado;
		
	}
	
		/**
	 * Metodo que transfiere la informacion de un vector a un arreglo
	 * @param vector vector a ser transferido
	 * @return arreglo
	 */	
		public static String [] TransformarVectoraArreglo(Vector vector){
			Logger log = Logger.getLogger(Helper.class);
		String [] arregloFinal=null;
		int longitudTotal=0;
		try{
			
			if (vector!=null){
				longitudTotal=vector.size();
				arregloFinal= new String[longitudTotal];
				for(int i=0;i<longitudTotal;i++){
					arregloFinal[i]=(String)vector.elementAt(i);
				}
			}
			
		}
		catch(Exception e){
			log.debug("Error transformando vector en arreglo: "+e);
		}
		return arregloFinal;
		
		
		
	}

	/**
	 * Metodo que obtiene la informacion de dos arreglos y la devuelve en un tercer arreglo.
	 * @param arreglo1 primer arreglo
	 * @param arreglo2 segundo arreglo
	 * @return arreglo resultado
	 */	
	public static String [] UnirArreglosStrings(String [] arreglo1,String [] arreglo2){
		Logger log = Logger.getLogger(Helper.class);
		String [] arregloFinal=null;
		int longitud1=0,longitud2=0,longitudTotal=0;
		int numReg;
		try{
			
			if (arreglo1!=null)
				longitud1=arreglo1.length;
			if (arreglo2!=null)
				longitud2=arreglo2.length;

			longitudTotal=longitud1 + longitud2;
			if (longitudTotal>0){
				arregloFinal = new String[ longitudTotal];
				for (numReg=0;numReg<longitud1;numReg++){
					arregloFinal[numReg]=arreglo1[numReg];
				}
				
				for (int i=0;i<longitud2;i++){
					arregloFinal[numReg]=arreglo2[i];
					numReg++;
				}
			}	
			
		}
		catch(Exception e){
			log.debug("Error uniendo arreglos: "+e);
		}
		return arregloFinal;
	}

	/**
	 * Returns the correlationId.
	 * @return int
	 */
	public static int getCorrelationId() {
		return correlationId;
	}

	
	/**
 * Metodo que le da un formato decimal a un monto pasado como cadena
 * @param monto monto a ser formateado
 * @param numeroDecimales numero de decimales a colocar.
 * @return cadena que contiene al numero formateado.
 */	
	public static String getFormatoDecimal(String monto,int numeroDecimales){
		Logger log = Logger.getLogger(Helper.class);
		String numero ="",decimal="",entero="";
		String p = "";		
		try{
			int longitud = monto.trim().length();
			int i=2,j=1;
			while (!p.equals(".") && i < longitud) { //se calcula la posicion del punto
				p = monto.substring(longitud - i++, longitud - j++);
			}
			if (p.equals(".")) { //si se encontro el punto
				entero = monto.substring(0, longitud - i + 1);	//parte entera
				decimal = monto.substring(longitud - j + 1, longitud);  //parte decimal
				while (decimal.trim().length() < numeroDecimales ) decimal = decimal + "0";
				if (decimal.length()>numeroDecimales)
					decimal = decimal.substring(0,numeroDecimales);
				
				log.debug("entero:"+entero);
				log.debug("decimal:"+decimal);
				numero = entero + "." +decimal.substring(0,numeroDecimales);
				log.debug("numero:"+numero);
			}
			else {
				numero = monto + ".0000";
				log.debug("numero:"+numero);
			}
		}
		catch (Exception e){
			log.debug("Error al aplicar Formato Decimal :"+e);
			numero = monto;
		}
		return numero;
	}

	/**
	 * Returns the xmlInputDirectory.
	 * @return String
	 */
	public static String getXmlInputDirectory() {
		return xmlInputDirectory;
	}

	/**
	 * Returns the xmlOutputDirectory.
	 * @return String
	 */
	public static String getXmlOutputDirectory() {
		return xmlOutputDirectory;
	}

	/**
	 * Returns the directorioOrigen.
	 * @return String
	 */
	public static String getDirectorioOrigen() {
		return directorioOrigen;
	}

	/**
	 * Returns the tipoProceso.
	 * @return String
	 */
	public static String getTipoProceso() {
		return tipoProceso;
	}

	/**
	 * Returns the formatoFecha.
	 * @return String
	 */
	//public static String getFormatoFechaBD() {
	//	return formatoFechaBD;
	//}
	
	
	
	
	public static String getMailFrom() {
		return mailFrom;
	}



	public static void setMailFrom(String mailFrom) {
		Helper.mailFrom = mailFrom;
	}



	public static String getMailFromName() {
		return mailFromName;
	}

	public static void setMailFromName(String mailFromName) {
		Helper.mailFromName = mailFromName;
	}

	public static String getMailHost() {
		return mailHost;
	}

	public static void setMailHost(String mailHost) {
		Helper.mailHost = mailHost;
	}

	public static String getMailHostName() {
		return mailHostName;
	}

	public static void setMailHostName(String mailHostName) {
		Helper.mailHostName = mailHostName;
	}

	public static String getMailUserId() {
		return mailUserId;
	}

	public static void setMailUserId(String mailUserId) {
		Helper.mailUserId = mailUserId;
	}

	public static String getMailPassword() {
		return mailPassword;
	}

	public static void setMailPassword(String mailPassword) {
		Helper.mailPassword = mailPassword;
	}

	public static String fill(String string, int length, String fillChar, int dir){
	 	if(fillChar==null || fillChar.trim().length() == 0)
	 		fillChar = " "; //$NON-NLS-1$
	 	else if(fillChar.trim().length()>1)
	 			fillChar = fillChar.substring(0,1);
	 		
	 	while(string.length()<length){
	 		switch (dir) {
				case FILL_LEFT:
					string = fillChar + string;
					break;
				case FILL_RIGHT :	
				default :
					string += fillChar;
					break;
			}
	 	}
	 	return string;
	 } 
   public static String toHexaString(byte lista[]){
	   	String result = null;
	   	if(lista!=null)
	   		result = toHexaString(lista,0,lista.length); 
		else
			result = null;
	   	return result;
   }   
   public static String toHexaString(byte lista[],int offset, int  length){
	   	String result = null;
	   	int index = 0;
	   	char nf = 0;
	   	if(lista==null)
	   		result = null;
	   	else {
	   		result = "";
	   		while((index+offset)<lista.length && index<length){
	   			nf = (char)(lista[index+offset] & 0xFF);			
	   			result += fill(Integer.toHexString(nf),2,"0",FILL_LEFT).toUpperCase(); //$NON-NLS-1$
	   			index++; 
	   		}
	   	}	
	   	return result;
   }
 
  public static Vector stringToArrayString(String cadena){
  		Vector vectorString = new Vector();
  		int i=0;
  		int longitudCadena = cadena.length();
  		while(i<longitudCadena){
  			vectorString.add(cadena.substring(i,i+2));
  			i+=2;
  		}
  		return vectorString;
  } 

  public static byte stringToByte(String cadena){
  		byte numero=0;
  		int entero = Integer.parseInt(cadena,16);
  		numero = (byte)entero;
  		return numero;
  }		
	
  
  public static byte[] stringToArrayOfBytes(String cadena){
	  Logger log = Logger.getLogger(Helper.class);
	  	byte arregloBytes[]=null;
	  	try{
	  		Vector vectorCadenas = stringToArrayString(cadena);
	  		int tamanhoVector = vectorCadenas.size();
	  		arregloBytes = new byte[tamanhoVector];
	  		for (int i=0;i<tamanhoVector;i++){
	  			arregloBytes[i]= stringToByte((String)vectorCadenas.get(i));
	  		}
	  	}
	  	catch(Exception e){
	  		log.debug("Error en el Helper: "+e);
	  	}
	  	return arregloBytes;
  }		
	
  	public static String[] QuitaCorreoComprador(String[] arreglo) {
  		String []arregloaux = new String[arreglo.length - 1]; 
  		for (int i=1; i<arreglo.length; i++) {
  			arregloaux[i - 1] = arreglo[i]; 
  		}
  		return arregloaux;
  	}
  	
	/**
	 * @return
	 */
	public static String getEmpresa() {
		return empresa;
	}

	public static void setEmpresa(String string) {
		empresa = string;
	}

	public static void crearCarpetasContenedoras(String directorioOrigen2, String carpeta) {
		Logger log = Logger.getLogger(Helper.class);
		File nuevo = new File(directorioOrigen2+File.separator+carpeta);
		log.debug("CREAR CARPETAS ************* 1 ");
		if(nuevo.mkdir()==true){
			log.debug("CREAR CARPETAS ************* 2 ");
			String directorio = directorioOrigen2+File.separator+carpeta;
			String directories[] = {"\\ERROR","\\INPUT","\\OUTPUT","\\PROCEED"};
			/*** CAMBIO MIJAIL 01.07.2009 PARA NUEVA CARPETA DE EDELIVERY ****/
			String subDirectories[] = {"\\FACTURAS","\\GUIA","\\MESSAGES","\\ORDER","\\QUOTATION","\\RFQ","\\RETENCIONES","\\DETRACCIONES\\LIQUIDACIONES","\\EDELIVERY"};
			log.debug("CREAR CARPETAS ************* 3 " + subDirectories.length);
			/*****************************************************************/
			String descono = "\\DESCONOCIDOS";
			for(int i=0; i<directories.length; i++){
				nuevo = new File(directorio+directories[i]);
				nuevo.mkdir();
				if(i==0){
					nuevo = new File(directorio+directories[i]+descono);
					nuevo.mkdir();
				}
				for(int j=0; j<subDirectories.length; j++){
					nuevo = new File(directorio+directories[i]+subDirectories[j]);
					nuevo.mkdir();
				}
			}
		}
	}
	
	public static void moveDiretory(File source, File dest){
		try {
			copyDirectory(source,dest);
			delete(source);
		} 
		catch (IOException e) {
			print("Error al mover los carpetas");
			e.printStackTrace();
		}
	}
	
	public static void copyDirectory(File sourceDir, File destDir) throws IOException{
	    if(!destDir.exists()){
	    	destDir.mkdir();
	    }
	    File[] children = sourceDir.listFiles();
	    for(int i=0; i<children.length; i++){
	    	File sourceChild = children[i];
	    	String name = sourceChild.getName();
	    	File destChild = new File(destDir, name);
	    	if(sourceChild.isDirectory()){
	    		copyDirectory(sourceChild, destChild);
	    	}
	    	else{
	    		copyFile(sourceChild, destChild);
	    	}
	    }
	}
	
	public static void moveFile(File source, File dest){
		print("source "+source.getAbsolutePath());
		print("dest "+dest.getAbsolutePath());
		try {
			copyFile(source,dest);
			delete(source);
		} 
		catch (IOException e) {
			print("Error al mover los archivos" + e.getMessage());
			e.printStackTrace();
		}
	}
	
	public static void copyFile(File source, File dest) {
		InputStream in = null;
	    OutputStream out = null;
	    FileWriter fw = null;
		try{
		    if(!dest.exists()){
		    	print("No existe lo voy a crear "+dest.getAbsoluteFile());
		    	//boolean b = dest.createNewFile();
		    	fw = new FileWriter(dest,true);
		    	if(fw!=null){
		    		
		    	}
		    }

	    	in = new FileInputStream(source);
	    	out = new FileOutputStream(dest);
	    	byte[] buf = new byte[1024];
	    	int len;
	    	while((len = in.read(buf)) > 0){
	    		out.write(buf, 0, len);
	    	}
		    
		}
		catch(IOException e){
	    	print("Error al crear al abrir el archivo "+e.getMessage());
	    }
	    finally{
	    	try{
	    		in.close();
	    		out.close();
	    	}
	    	catch(IOException em){
	    		
	    	}
	    }
	}

	public static boolean delete(File resource) throws IOException{ 
	    if(resource.isDirectory()){
	    	File[] childFiles = resource.listFiles();
	    	for(int i=0; i<childFiles.length;i++){
	    		File child = childFiles[i];
	    		delete(child);
	    	}
	    }
	    return resource.delete();
	}


	public static void enviarEmail(MailAttributes matts) {
		Logger log = Logger.getLogger(Helper.class);
		try{
			log.debug("Enviando email");
			new Mailer().sendMail(matts);
		}
		catch(MessagingException me){
			log.debug("Error al enviar el mail "+me.toString());
		}
		catch (Exception ex){
			log.debug("No se pudo enviar correo al Operador:"+ex);
		}
		
	}
	
	/***************************CAMBIOS RHANDY 30-04-2010************/
	public int validaDatoDouble(Object dato){
		int mires=0;
		try {
			Double.parseDouble((String) dato);
				mires=1;
		} catch (NumberFormatException e) {
				mires=0;
			// TODO: handle exception
		}
		return mires;
	}
	
	public int validaDatoInt(Object dato){
		int mires=0;
		try {
			Integer.parseInt((String) dato);
				mires=1;
		} catch (NumberFormatException e) {
				mires=0;
			// TODO: handle exception
		}
		return mires;
	}
	
	public int validaFecha(Object dato){
		int mires=0;
		try {
			Date d=new Date();
			d=(Date) dato;
				mires=1;
		} catch (Exception e) {
				mires=0;
			// TODO: handle exception
		}
		return mires;
	}
	/***************************************************************/
	

	public static String getFechaXMLToFechaTimestamp(Date date) throws Exception {
    
		String fecha=date.toString();
		//public static Logger log = Logger.getLogger(Helper.class);
		// 	strfechaxml = "mm/dd/yyyy" -->  "yyyy-MM-dd : hh:mm:ss"
		//29/03/2010 ----> 2010-29-03
		String s = new String("");
        
		if (fecha!=null && fecha.length()==10)
		{
			//log.d
			
			log2.info("fecha: " + fecha + "	Longitud: " + fecha.length());
			s = fecha.substring(6,10)+"-"+fecha.substring(0,2)+"-"+fecha.substring(3,5)+" 00:00:00";
			log2.debug("nueva fecha: " + s);
			return s;
		}
		else{
		   if (fecha==null || fecha.trim().length()<10 )
		   {
                       return null;
		   }
		   else
                        throw new Exception("Error Formato MM/dd/yyyy");
		}
	}
	

}